<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Object.getOwnPropertyDescriptor</title>
</head>

<body>

</body>
<script>
  "use strict"; {
    /*
      获取对象属性的特征
      Object.getOwnPropertyDescriptor();
      获取到对象所有属性的特征
      Object.getOwnPropertyDescriptors();
    */
    const user = {
      name: "陈宇",
      age: 10
    };
    // console.log(JSON.stringify(Object.getOwnPropertyDescriptor(user, "age"), null, 4));
    // console.log(JSON.stringify(Object.getOwnPropertyDescriptors(user), null, 4));
  }; {
    /*
    Object.defineProperty(obj,prop,descriptor);
      value: 设置默认值，默认值为nudefined
      writable: 值是否可以重写，true|false 默认值true
      enumerable: 目标属性是否可以遍历 true|false 默认值true
      configurable: 目标属性是否可以被删除或是可以再次修改特性true|false 默认值true

    对对象属性批量的设置
    Object.defineProperties(obj,props);
    */
    let obj = {
      id: 1,
      name: "yc",
    };
    Object.defineProperty(obj, "id", {
      value: 10,
      writable: false,
      enumerable: true,
      configurable: true
    });
    // delete obj.id;
    // console.log(JSON.stringify(obj, null, 4));

    // 同时批量的设置属性
    Object.defineProperties(obj, {
      id: {
        value: 99
      },
      name: {
        value: "好的了吧"
      }
    });
    // console.log(JSON.stringify(obj, null, 4));
  }; {
    /*
    禁止向对象中添加属性或方法(不可添加新属性)
      Object.preventExtensions
    
    判断是否可以添加属性或方法
      Object.isExtensible
    */
    let obj = {
      name: "yc",
      age: 20,
      say: "Hello word!"
    };
    Object.preventExtensions(obj);
    if (Object.isExtensible(obj)) {
      obj.price = 1000;
    };
    // console.log(JSON.stringify(obj, null, 4));
  }; {
    /* 
    封闭对象
      Object.seal();
      不能添加属性或方法和删除(1.不可添加新属性2.不可删除属性3.可修改属性值)

    判断对象是否处于封闭状态
      Object.isSealed()
    */
    let obj = {
      name: "陈宇",
      age: 10
    };
    Object.seal(obj);
    console.log(JSON.stringify(obj, null, 4));
  }; {
    /* 
    冻结对象(只能看，不能对它做任何操作)
      Object.freeze()
    
    判断是否冻结
      Object.isFrozen()   
    */
    let obj = {
      name: "好人",
      age: 10
    };
    Object.freeze(obj);
  }; {
    // 使用 Object.getOwnPropertyNames() 函数能够返回指定对象私有属性的名称。私有属性是指用户在本地定义的属性，而不是继承的原型属性。具体用法如下：
    let obj = { x: 1, y: 2, z: 3 };
    let arr = Object.getOwnPropertyNames(obj);
    console.log(arr);  //返回属性名：x,yz
  }; {
    // delete 删除一个对象的属性
    let obj = { a: 123, b: 100 };
    delete obj.a;
    console.log(JSON.stringify(obj, null, 2));
  };
</script>

</html>